/*
* rains[i]>0:第i天第rains[i]个湖泊会下雨
* rasins[i]==0:抽干任意一个湖泊的水

* 重复下雨会导致洪水
* 如果发生洪水，返灰空数组
*/
class Solution {
public:
    vector<int> avoidFlood(vector<int>& rains) {
        int n=rains.size(); //抽干水次数
        set<int> dry; //第i天可以抽干水
        unordered_map<int, int> lakes; //0空 1满 2洪水
        vector<int> ans(n, -1); //-1不能作处理，ans[i]>0为抽干湖泊i的水
        for(int day=0; day<n; day++)
        {
            int lake=rains[day]; //当天lake下雨
            if(rains[day]==0){ //当天不下雨
                ans[day]=1; //当天之后用于抽干,先默认抽干湖1
                dry.insert(day); //当天可以抽干水 
                continue;
            } 
            if(lakes.contains(lake)) { //lake在之前下过雨
                auto it=dry.upper_bound(lakes[lake]); //找下雨之后的一天抽干水
                if(it==dry.end()) return {}; //不能抽水，一定发生洪水

                ans[*it]=lake; //可以抽干水的那天抽干将发生洪水的水
                dry.erase(it);          
            }
            lakes[lake]=day; //湖lake在day充满水(lake==0时无需额外处理)
        }
        return ans;
    }
};